package com.heima.juc.n8;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

/**
 * @author : leimingchao
 * @date Date : 2022年02月20日 7:26
 */
@Slf4j(topic = "c.TestForkJoin")
public class TestForkJoin {

    public static void main(String[] args) {

        ForkJoinPool forkJoinPool = new ForkJoinPool(4);
        System.out.println(forkJoinPool.invoke(new MyTask(5)));
    }
}

/**
 * 如果任务有返回值，继承RecursiveTask
 * 如果任务没有返回值，继承RecursiveAction
 *
 * 1~n之间整数的和
 */
@Slf4j(topic = "c.MyTask")
class MyTask extends RecursiveTask<Integer> {

    private int n;

    public MyTask(int n) {
        this.n = n;
    }

    @Override
    public String toString() {
        return "{" + n + '}';
    }

    @Override
    protected Integer compute() {

        // //终止条件
        // if (n == 1) {
        //     return 1;
        // }
        //
        // MyTask t1 = new MyTask(n - 1);
        // //让一个线程去执行此任务
        // t1.fork();
        //
        // //获取任务结果
        // int result = n + t1.join();
        //
        // return result;

        // 如果 n 已经为 1，可以求得结果了
        if (n == 1) {
            log.debug("join() {}", n);
            return n;
        }

        // 将任务进行拆分(fork)
        MyTask t1 = new MyTask(n - 1);
        t1.fork();
        log.debug("fork() {} + {}", n, t1);

        // 合并(join)结果
        int result = n + t1.join();
        log.debug("join() {} + {} = {}", n, t1, result);
        return result;
    }
}
